import logging
import os
from logging.handlers import TimedRotatingFileHandler
from typing import Optional


class LoggerGenerator:
    """
    日志生成器类，用于创建和配置日志记录器

    功能：
    - 支持控制台和文件两种输出方式
    - 支持按时间轮转日志文件
    - 支持自定义日志格式
    - 支持不同日志级别
    """

    # 类变量，存储已创建的logger实例
    _loggers = {}

    def __init__(self):
        raise NotImplementedError("LoggerGenerator should not be instantiated directly. Use get_logger() instead.")

    @classmethod
    def get_logger(
            cls,
            name: str = "root",
            log_level: int = logging.INFO,
            log_file: Optional[str] = None,
            console_output: bool = True,
            file_output: bool = True,
            log_format: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
            date_format: str = "%Y-%m-%d %H:%M:%S",
            when: str = "midnight",
            backup_count: int = 7,
            encoding: str = "utf-8"
    ) -> logging.Logger:
        """
        获取或创建日志记录器

        参数:
        - name: 日志记录器名称
        - log_level: 日志级别 (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
        - log_file: 日志文件路径，如果为None则不输出到文件
        - console_output: 是否输出到控制台
        - file_output: 是否输出到文件
        - log_format: 日志格式
        - date_format: 日期格式
        - when: 日志轮转时间 ('S', 'M', 'H', 'D', 'midnight', 'W0'-'W6')
        - backup_count: 保留的日志文件数量
        - encoding: 日志文件编码

        返回:
        - 配置好的logging.Logger实例
        """
        if name in cls._loggers:
            return cls._loggers[name]

        # 创建logger
        logger = logging.getLogger(name)
        logger.setLevel(log_level)
        # 防止日志向根记录器冒泡造成重复输出
        logger.propagate = False

        # 避免重复添加handler
        if logger.handlers:
            return logger

        formatter = logging.Formatter(log_format, datefmt=date_format)

        # 控制台输出
        if console_output:
            console_handler = logging.StreamHandler()
            console_handler.setFormatter(formatter)
            logger.addHandler(console_handler)

        # 文件输出
        if file_output and log_file:
            # 确保日志目录存在
            log_dir = os.path.dirname(log_file)
            if log_dir and not os.path.exists(log_dir):
                os.makedirs(log_dir)

            file_handler = TimedRotatingFileHandler(
                filename=log_file,
                when=when,
                backupCount=backup_count,
                encoding=encoding
            )
            file_handler.setFormatter(formatter)
            logger.addHandler(file_handler)

        cls._loggers[name] = logger
        return logger

    @classmethod
    def set_level(cls, name: str, level: int) -> None:
        """
        设置已存在日志记录器的级别

        参数:
        - name: 日志记录器名称
        - level: 日志级别
        """
        if name in cls._loggers:
            cls._loggers[name].setLevel(level)

    @classmethod
    def disable_logger(cls, name: str) -> None:
        """
        禁用指定日志记录器

        参数:
        - name: 日志记录器名称
        """
        if name in cls._loggers:
            logging.getLogger(name).disabled = True

# 注意：不要在模块导入时实例化 LoggerGenerator，以避免抛出异常

# 示例用法
if __name__ == "__main__":
    # 获取默认配置的logger
    logger = LoggerGenerator.get_logger(name="app")
    logger.info("This is an info message from logger1")
